﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Data;
using System.Data.OleDb;

namespace MikroMagazaObject
{
    public class InterMpos : IPos
    {
        public string opaPath { get; set; }
        Dictionary<string, Urun> _urunler = new Dictionary<string, Urun>();
        public string KdvSiralamasi { get; set; }
        public string KasaConn { get; set; }

        private string[] getFileName(DateTime startDate)
        {
            List<string> _files = new List<string>();
            for (int i = 0; i < 1; i++)
            {
                _files.AddRange(Directory.GetFiles(this.opaPath + "\\POSGENEL", string.Format("HR{0}{1}{2}.*", startDate.AddDays(i).Day.ToString("00"), startDate.AddDays(i).Month.ToString("00"), startDate.AddDays(i).Year.ToString().Substring(2))));
            }
            List<string> remove = new List<string>();
            foreach (string fl in _files)
            {
                string txt = File.ReadAllText(fl);
                if (txt.IndexOf("TAR") == -1 && txt.IndexOf("MLC") == -1 && txt.IndexOf("VER") == -1)
                {
                    remove.Add(fl);
                }
            }
            foreach (string s in remove)
            {
                _files.Remove(s);
            }
            return _files.ToArray();
        }
        private string isnullSetZero(string deger)
        {
            if (string.IsNullOrEmpty(deger))
            {
                return "0";
            }
            else
            {
                return deger;
            }
        }
        private void LoadStocks()
        {
            using (OleDbConnection cn = new OleDbConnection(KasaConn))
            {
                cn.Open();
                using (OleDbCommand cmd = new OleDbCommand("SELECT TBL_STOK.stokid, TBL_BARKOD.barkod, TBL_STOK.stokkod, TBL_STOK.stokad, TBL_STOK.perakendekdv  FROM TBL_STOK INNER JOIN TBL_BARKOD ON TBL_STOK.stokid = TBL_BARKOD.stokid", cn))
                {
                    OleDbDataReader rd = cmd.ExecuteReader();
                    while (rd.Read())
                    {
                        if (!_urunler.ContainsKey(rd.GetString(1)))
                        {
                            _urunler.Add(rd.GetString(1), new Urun()
                            {
                                Adi = rd.GetString(3),
                                Kodu = rd.GetString(2),
                                StokId = rd.GetInt32(0),
                                VergiOrani = rd.GetInt32(4)
                            });
                        }
                    }
                    rd.Close();
                }
                cn.Close();
            }
        }
        private string ZeroRemoveStart(string deger)
        {
            string sonuc = "";
            bool basla = false;
            foreach (Char c in deger.ToCharArray())
            {
                if (c != '0' && basla == false)
                {
                    basla = true;
                }

                if (basla)
                {
                    sonuc += c;
                }
            }
            return sonuc;
        }
        private string ZeroRemoveEnd(string deger)
        {
            string sonuc = "";
            bool basla = true;
            foreach (Char c in deger.ToCharArray())
            {
                if (c != '0' && basla == true)
                {
                    basla = false;
                }

                if (basla)
                {
                    sonuc += c;
                }
            }
            return sonuc;
        }
        private int GetKdvOran(int kdvSira)
        {
            string[] kdv = this.KdvSiralamasi.Split(',');
            if (kdvSira <= kdv.Length)
            {
                return Cevir.Parse<int>(kdv[kdvSira - 1]);
            }
            else
            {
                return 0;
            }
        }
        public List<Document> SatisBilgisi(DateTime startDate)
        {
            LoadStocks();
            List<Document> Lines = new List<Document>();
            string[] files = getFileName(startDate);
            foreach (string file in files)
            {
                if (File.Exists(file))
                {
                    using (StreamReader sr = new StreamReader(file))
                    {
                        string satir = string.Empty;
                        string flag = string.Empty;
                        Document doc = null;
                        while (sr.Peek() > -1)
                        {
                            satir = sr.ReadLine();
                            flag = satir.Substring(11, 3);
                            switch (flag)
                            {
                                case "FIS":
                                    doc = new Document();
                                    doc.BelgeTipi = 0;
                                    doc.PosNo = ZeroRemoveStart(satir.Substring(15, 3)).ToInt();
                                    doc.KasiyerNo = ZeroRemoveStart(satir.Substring(23, 4));
                                    doc.FaturaNo = ZeroRemoveStart(satir.Substring(28, 6).Trim());
                                    //Line.ZRapNo = ZeroRemoveStart(satir.Substring(36, 4));
                                    break;
                                case "GPS":
                                    doc = new Document();
                                    doc.BelgeTipi = 1;
                                    doc.PosNo = ZeroRemoveStart(satir.Substring(15, 3)).ToInt();
                                    doc.KasiyerNo = ZeroRemoveStart(satir.Substring(23, 4));
                                    doc.FaturaNo = ZeroRemoveStart(satir.Substring(28, 6).Trim());
                                    //Line.ZRapNo = ZeroRemoveStart(satir.Substring(36, 4));
                                    break;
                                case "FAT":
                                    doc = new Document();
                                    doc.BelgeTipi = 0;
                                    doc.PosNo = ZeroRemoveStart(satir.Substring(15, 3)).ToInt();
                                    doc.KasiyerNo = ZeroRemoveStart(satir.Substring(23, 4));
                                    doc.FaturaNo = ZeroRemoveStart(satir.Substring(28, 5).Trim());
                                    doc.FaturaNo = doc.FaturaNo;
                                    //Line.ZRapNo = ZeroRemoveStart(satir.Substring(36, 4));
                                    break;
                                case "TAR":
                                    doc.Tarih = satir.Substring(15, 10).Trim().ToDateTime();
                                    doc.Saat = satir.Substring(28, 2);
                                    break;
                                case "SAT":
                                    Line child = new Line();
                                    child.Tip = 0;
                                    child.Miktar = Cevir.Parse<decimal>(satir.Substring(15, 6).Replace('.', ','));
                                    child.KdvSirasi = Cevir.Parse<byte>(ZeroRemoveStart(satir.Substring(28, 2)));
                                    child.Toplam = Cevir.Parse<decimal>(satir.Substring(30, 10).Trim().Replace('.', ','));
                                    child.KdvToplam = Math.Round(child.Toplam - (child.Toplam / ((100m + GetKdvOran(child.KdvSirasi)) / 100m)), 2);
                                    child.Fiyat = child.Toplam / child.Miktar;
                                    child.PluNo = ZeroRemoveStart(satir.Substring(21, 6));
                                    doc.KdvDahilToplam += child.Toplam;
                                    doc.KdvTutari += child.KdvToplam;
                                    doc.Lines.Add(child);
                                    break;
                                case "BKD":
                                    if (doc != null)
                                    {
                                        string barkod = (satir.Substring(15, 12) + satir.Substring(28, 8)).Trim();
                                        if (doc.Lines.Count > 0)
                                        {
                                            doc.Lines[doc.Lines.Count - 1].Barkod = barkod;
                                            if (_urunler.ContainsKey(barkod))
                                            {
                                                doc.Lines[doc.Lines.Count - 1].StokKodu = _urunler[barkod].Kodu;
                                                doc.Lines[doc.Lines.Count - 1].KdvOrani = _urunler[barkod].VergiOrani;
                                            }
                                        }
                                    }
                                    break;
                                //case "SNO":
                                //    doc.Lines[doc.Lines.Count - 1].SeriNoBilgisi = (satir.Substring(15, 12) + satir.Substring(28, 12)).Trim();
                                //    break;
                                case "GAL":
                                    Line ichild = new Line();
                                    ichild.Tip = 0;
                                    ichild.Miktar = Cevir.Parse<decimal>(satir.Substring(15, 6).Replace('.', ','));
                                    ichild.KdvSirasi = Cevir.Parse<byte>(ZeroRemoveStart(satir.Substring(28, 2)));
                                    ichild.Toplam = Cevir.Parse<decimal>(satir.Substring(30, 10).Trim().Replace('.', ','));
                                    ichild.KdvToplam = Math.Round(ichild.Toplam - (ichild.Toplam / ((100m + GetKdvOran(ichild.KdvSirasi)) / 100m)), 2);
                                    ichild.Fiyat = ichild.Toplam / ichild.Miktar;
                                    ichild.PluNo = ZeroRemoveStart(satir.Substring(21, 6));

                                    doc.KdvDahilToplam += ichild.Toplam;
                                    doc.KdvTutari += ichild.KdvToplam;
                                    doc.Lines.Add(ichild);
                                    break;
                                case "IPT": //iptal işlemi
                                    Line tchild = new Line();
                                    tchild.Tip = 0;
                                    tchild.Miktar = Cevir.Parse<decimal>(satir.Substring(15, 6).Replace('.', ','));
                                    tchild.KdvSirasi = Cevir.Parse<byte>(ZeroRemoveStart(satir.Substring(28, 2)));
                                    tchild.Toplam = Cevir.Parse<decimal>(satir.Substring(30, 10).Trim().Replace('.', ','));
                                    tchild.KdvToplam = Math.Round(tchild.Toplam - (tchild.Toplam / ((100m + GetKdvOran(tchild.KdvSirasi)) / 100m)), 2);
                                    tchild.Fiyat = tchild.Toplam / tchild.Miktar;
                                    tchild.PluNo = ZeroRemoveStart(satir.Substring(21, 6));
                                    doc.KdvDahilToplam += tchild.Toplam;
                                    doc.KdvTutari += tchild.KdvToplam;


                                    List<Line> sil = new List<Line>();
                                    foreach (Line l in doc.Lines.Where(x => x.PluNo == tchild.PluNo))
                                    {
                                        if (tchild.Miktar > 0)
                                        {
                                            if (tchild.Miktar > l.Miktar)
                                            {
                                                tchild.Miktar -= l.Miktar;
                                                sil.Add(l);
                                            }
                                            else if (tchild.Miktar == l.Miktar)
                                            {
                                                tchild.Miktar = 0;
                                                sil.Add(l);
                                                break;
                                            }
                                            else
                                            {
                                                l.Miktar -= tchild.Miktar;
                                                l.Toplam -= tchild.Toplam;
                                                l.KdvToplam -= tchild.KdvToplam;
                                                l.Iskonto1 -= tchild.Iskonto1;
                                            }
                                        }
                                    }
                                    foreach (Line s in sil)
                                    {
                                        doc.Lines.Remove(s);
                                    }

                                    break;
                                //case "IND": //indirim işlemi
                                //    string indTutari = satir.Substring(30, 10).Trim().Replace('.', ',');
                                //    if (string.IsNullOrEmpty(indTutari))
                                //    {
                                //        indTutari = "0";
                                //    }
                                //    if (satir.Substring(15, 3) == "TOP" || satir.Substring(15, 3) == "SNS")
                                //    {
                                //        doc.IndirimToplami = Cevir.Parse<decimal>(indTutari);
                                //        doc.ToplamaYapilanIndirim = doc.IndirimToplami;
                                //        decimal oran = 0;
                                //        foreach (Child ch in doc.Childs)
                                //        {
                                //            oran = ch.KdvDahilBurutTutar * 100m / doc.KdvDahilBurutToplam;
                                //            ch.IndirimToplami = doc.IndirimToplami * (oran / 100m);
                                //        }
                                //    }
                                //    else if (satir.Substring(15, 3) == "URN")
                                //    {
                                //        doc.Childs[doc.Childs.Count - 1].IndirimToplami = Cevir.Parse<decimal>(indTutari);
                                //        doc.UruneYapilanIndirim += Cevir.Parse<decimal>(indTutari);
                                //    }
                                //    break;
                                case "TOP":
                                    doc.KdvDahilToplam = Cevir.Parse<decimal>(satir.Substring(30, 10).Trim().Replace('.', ','));
                                    break;
                                //case "NAK":
                                //    if (doc.BelgeTipi == 1)
                                //        doc. = -1 * Cevir.Parse<decimal>(satir.Substring(30, 10).Trim().Replace('.', ','));
                                //    else
                                //        doc.NakitToplam = Cevir.Parse<decimal>(satir.Substring(30, 10).Trim().Replace('.', ','));
                                //    break;
                                //case "KRD":
                                //    doc.KrediTusNo = satir.Substring(25, 2).Trim();
                                //    doc.TaksitSayisi = satir.Substring(28, 2).Trim();
                                //    if (doc.EvrakTipi == EvrakTipi.Iade)
                                //        doc.KrediTusToplam = -1 * Cevir.Parse<decimal>(satir.Substring(30, 10).Trim().Replace('.', ','));
                                //    else
                                //        doc.KrediTusToplam = Cevir.Parse<decimal>(satir.Substring(30, 10).Trim().Replace('.', ','));
                                //    break;
                                //case "BNS":
                                //    doc.PuanBilgisi = satir.Substring(30, 8).Trim();
                                //    break;
                                //case "STC":
                                //    doc.SaticiKodu = satir.Substring(15, 4).Trim();
                                //    break;
                                case "SON":
                                    doc.MusteriNo = (satir.Substring(15, 12) + satir.Substring(28, 8)).Trim();
                                    if (string.IsNullOrEmpty(doc.MusteriNo))
                                    {
                                        doc.MusteriNo = "0";
                                    }
                                    //doc.FaturaTipi = satir.Substring(38, 1).Trim();
                                    //doc.AcikFatura = satir.Substring(39, 1).Trim();
                                    Lines.Add(doc);
                                    break;
                                default:
                                    break;
                            }
                        }
                        sr.Close();
                    }
                }
            }

            return Lines;
        }
    }
}
